package com.chandon.juc.thread_basic;

import com.chandon.juc.SleepThread;

/**
 * volatile的线程可见性作为线程标志位 停止线程，相当于自定义的interrupt标志位。
 * 适用于在while中操作无状态数据的逻辑
 *      不适合的场景，因为volatile标志位同步到线程的时间不精确
 *
 *      1. 无法精确控制while循环次数即无法精确控制打断位置：
 *           如操作容器时无法精确控制容器中需要处理元素的数量
 *
 *      2. while循环中如果有wait,sleep阻塞状态,则无法进入下次循环读volatile标志位
 *
 * @author Dong
 * @version 1.0
 * @date 2021-04-10 17:33
 */

public class T04B_volatile_StopThread {

    private static volatile Boolean RUNNING = true;

    public static void main(String[] args) {

        new Thread(new ThreadA()).start();

        // do something
        SleepThread.sleep(1);
        RUNNING = false;


    }

    static class ThreadA implements Runnable {


        @Override
        public void run() {
            long i = 0l;

            while (RUNNING) {
                i++;

                //每次结果都不同：177769  129244 147880无法精确控制在哪个数字上停止
                System.out.println(i);

            }
        }


    }

}
